package com.cyj.dream.middleware.blackwhitelist.config;

import com.baomidou.mybatisplus.extension.api.R;
import com.cyj.dream.middleware.blackwhitelist.aspect.DoJoinPoint;
import com.cyj.dream.middleware.blackwhitelist.entity.SysBlackWhite;
import com.cyj.dream.middleware.blackwhitelist.service.SysBlackWhiteService;
import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;

import javax.annotation.Resource;
import java.util.List;

/**
 * @Description: 梦享云--中间件整合模块--这里有个小细节要分享 假如这个starter要提供给别人用
 * 记得在WhiteListAutoConfigure上面加上@ComponentScan扫描切面所在的类 否则当使用这个starter的客户端调用的时候
 * 就要自己在main上面加@ComponentScan 这样就不友好了
 * 1. @ConditionalOnClass(WhiteListProperties.class)，当 WhiteListProperties 位于当前类路径上，才会实例化一个类。除此之外还有其他属于此系列的常用的注解。
 * 1.1 @ConditionalOnBean 仅仅在当前上下文中存在某个对象时，才会实例化一个 Bean
 * 1.2 @ConditionalOnClass 某个 CLASS 位于类路径上，才会实例化一个 Bean
 * 1.3 @ConditionalOnExpression 当表达式为 true 的时候，才会实例化一个 Bean
 * 1.4 @ConditionalOnMissingBean 仅仅在当前上下文中不存在某个对象时，才会实例化一个 Bean
 * 1.5 @ConditionalOnMissingClass 某个 CLASS 类路径上不存在的时候，才会实例化一个 Bean
 * @BelongsProject: DreamChardonnayCloud
 * @BelongsPackage: com.cyj.dream.middleware.blackwhitelist.config
 * @Author: ChenYongJia
 * @CreateTime: 2021-09-14 21:28
 * @Email: chen87647213@163.com
 * @Version: 1.0
 */
@Slf4j
@EnableAsync
@Configuration(proxyBeanMethods = false)
//@ComponentScan("com.cyj.dream.whitelist.blackwhitelist.aspect")
@ConditionalOnClass(WhiteListProperties.class)
@MapperScan(basePackages = "com.cyj.dream.middleware.blackwhitelist.mapper")
@EnableConfigurationProperties(WhiteListProperties.class)
public class WhiteListAutoConfiguration {

    @Resource
    private SysBlackWhiteService sysBlackWhiteService;

    /**
     * 1. @Bean，在 whiteListConfig 方法上我们添加了这个注解以及方法入参 WhiteListProperties properties。这里面包括如下几个内容：
     * properties 配置会被注入进来，当然你也可以选择使用 @Autowired 的方式配置注入在使用属性。
     * 整个方法会在配置信息和Bean注册完成后，开始被实例化加载到 Spring 中。
     * 2. @ConditionalOnMissingBean，现在就用到了这个方法上，代表只会实例化一个 Bean 对象。
     *
     * @param * @param properties
     * @return * @return java.lang.String
     * @author ChenYongJia
     * @date 13:28 2021/9/15
     */
    @Bean("whiteListConfig")
    @ConditionalOnMissingBean
    public String whiteListConfig(WhiteListProperties properties) {
    //public List<SysBlackWhite> whiteListConfig() {
        List<SysBlackWhite> sysBlackWhiteList = sysBlackWhiteService.getAllSysBlackWhite();
        log.info("获取到的黑白名单信息为：{}", sysBlackWhiteList);
        // return sysBlackWhiteList;
        return properties.getUsers();
    }

    /**
     * 在 WhiteListAutoConfigure 中配置 Bean，去掉 DoJoinPoint 中的 @Component
     *
     * @return DoJoinPoint
     * @date 2021/9/14 21:53
     * @author ChenYongJia
     * @version 1.0
     */
    @Bean
    @ConditionalOnMissingBean
    public DoJoinPoint point() {
        return new DoJoinPoint();
    }


}